"""
@Author: 霍格沃兹测试开发学社-西西
@Desc: 更多测试开发技术探讨，请访问：https://ceshiren.com/t/topic/15860
"""
# 1、通过构造函数创建
# li1 = list()  # 空列表
# li1 = list('hogwarts')  # 字符串
# li1 = list((1, 2, 3))  # 元组
# li1 = list({4, 5, 6})  # 集合
# li1 = list({'a': 7, 'b': 8})  # 字典
# print(type(li1), li1)
#
# # 2、中括号创建并填充元素
# li2 = []  # 空列表
# li2 = [1, 2, 3]  # 直接填充对象
# print(type(li2), li2)

# 列表的索引
li = [1, 2, 3, 4, 5]

# 1、正向索引
print(li[0])  # 打印1
print(li[3])  # 打印4

# 2、反向索引
li = [1, 2, 3, 4, 5]
# -1 表示倒数第一位
print(li[-1])  # 打印 5
# -2 表示倒数第二位
print(li[-2])  # 打印 4

mylist = [10,20,30,40,50,60,70,80,90]
print(mylist[2:6])

# 切片基本用法
li = ['h', 'o', 'g', 'w', 'a', 'r', 't', 's']

print(li[2:4]) #['g','w']
print(li[:4]) # ['h', 'o', 'g', 'w']
print(li[2:])  # ['g', 'w', 'a', 'r', 't', 's']
print(li[::2]) # ['h', 'g', 'a','t']
print(li[::-1]) #['s', 't', 'r', 'a', 'w', 'g', 'o', 'h']
print(li[0:5:2]) # ['h', 'g', 'a']


# 1、重复
li = [1] * 5
print(li)  # 打印[1, 1, 1, 1, 1]

# 2、合并
li1 = [1, 2, 3]
li2 = [99, 100,0,4]
print(li1 + li2)


# 添加元素
# 添加元素
li = []
li.append(1)
li.append(3.14)
li.append("hogwarts")
li.append([6, 6, 6])
li.append((1.2, 1.5))
li.append({'msg': "Hello"})
# [1, 3.14, "hogwarts", [6, 6, 6],(1.2, 1.5),{'msg': "Hello"} ]
print(li)  # 打印列表
print(len(li))  # 获取列表元素个数


# extend()的用法

li = []
li.extend('hogwarts')  # 添加的是字符串的所有字母  A. ['hogwarts']  B. ['h','o','g','w','a','r','t','s']
li.extend([1, 2, 3])  # 接收列表的所有元素 ['h','o','g','w','a','r','t','s',1,2,3]
li.extend((4, 5, 6))  # 接收元组的所有元素
li.extend({'a': 1, 'b': 2})  # 接收字典的所有key值
print(li)


## insert 用法

li = [0, 1, 2]
print("插入前: ", li)  # 打印 [0, 1, 2]

# 在索引0的位置插入元素
li.insert(0, 'hogwarts')
print("插入后: ", li)  # 打印 ['hogwarts', 0, 1, 2]

# pop() 用法

letters = ['h', 'o', 'g', 'w', 'a', 'r', 't', 's']

# 传入索引3，弹出元素 w
n1 = letters.pop(3)
print(n1)  # 打印 w

# 不传参数，默认弹出末尾元素
n2 = letters.pop()
print(n2)  # 打印 s
print(letters)
n3 = letters.pop()
print(n3)
# 逐行解析
# n4 = letters.pop(5)
# print(n4)

## remove 用法

li = ['h', 'o', 'g', 'w', 'a', 'r', 't', 's']
print(len(li))  # 打印 8

# 1、删除指定元素'h'
li.remove('h')
print(li)  # 打印 ['o', 'g', 'w', 'a', 'r', 't', 's']
print(len(li))  # 打印 7
#
# 2、移除第一个2
li = [1, 2, 3, 2, 1]
li.remove(2)
print(li)  # 打印 [1, 3, 2, 1]
#
# # 3、删除不存在的元素，会报ValueError错误
# li = [1, 2, 3]
# li.remove(100)

# sort() 用法

nums = [2, 4, 3, 1, 5]
print(nums)
# 1、不传参数，默认升序，数字从小到大排列
nums.sort()
print(nums)  # 打印 [1, 2, 3, 4, 5]

# # 2、指定key=len，按元素的长度排序
words = ['Python', 'Java', 'R', 'Go']
words.sort(key=len)
print(words)  # 打印 ['R', 'Go', 'Java', 'Python']

# 3、指定reverse=True，降序
nums = [2, 4, 3, 1, 5]
nums.sort(reverse=True)
print(nums)  # 打印 [5, 4, 3, 2, 1]

# 反转顺序
nums = [8, 1, 5, 2, 77]
nums.reverse()
print(nums)  # 打印[77, 2, 5, 1, 8]

# 1、创建嵌套列表
li_2d = [['a', 'b', 'c'], [1, 2, 3]]
# li_2d[0][2]
# li_2d[1][1]
print(type(li_2d))  # 打印<class 'list'>
print(len(li_2d))  # 打印 2

# 2、访问嵌套列表中的元素
print(li_2d[0][2])  # 打印 'c'

# 列表推导式

mylist = []
for i in range(0,101,2):
    mylist.append(i)
print(f"for 循环得到的mylist :{mylist}")

mylist1 = [i for i in range(0,101,2) ]
print(f"列表推导式得到的mylist：{mylist1}")


"""
实例：将 1-10 中的所有偶数平方后组成新的列表
"""

# 1、传统解决方案
result = []
for ele in range(1, 11):
    if ele % 2 == 0:
        result.append(ele ** 2)
print(result)  # 打印 [4, 16, 36, 64, 100]

# 2、使用列表推导式
result = [ele ** 2 for ele in range(1, 11) if ele % 2 == 0]
print(result)  # 打印 [4, 16, 36, 64, 100]

my_jishu_list = [i for i in  range(1,100,2)]
print(my_jishu_list)
